package nuaa.service;

import nuaa.dao.IIndexDao;
import nuaa.dao.IUserAndGroupDao;
import nuaa.dao.IUserDao;
import nuaa.domain.Administrator;
import nuaa.domain.Collection;
import nuaa.domain.Group;
import nuaa.domain.OrdinaryUser;
import nuaa.domain.vo.MessageModel;
import nuaa.util.UtilSqlSession;
import nuaa.util.UtilString;
import nuaa.util.UtilUser;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.LinkedList;
import java.util.List;

public class UserService {

    /*持久层对象，提供对数据库的操作*/
    IUserDao userDao = UtilSqlSession.getSqlSession().getMapper(IUserDao.class);
    /*提供对userandgroup数据表的操作*/
    IUserAndGroupDao userAndGroupDao = UtilSqlSession.getSqlSession().getMapper(IUserAndGroupDao.class);

    public UserService() throws IOException {
    }

    /**
     * 用户登录
     * @param ouser
     * @return
     * @throws IOException
     */
    public MessageModel userLogin(OrdinaryUser ouser) throws IOException {
        MessageModel messageModel = new MessageModel();
        //先把原来的对象放到消息模型对象中
        messageModel.setObject(ouser);

        //1.参数非空判断：email password
        if (UtilString.isEmpty(ouser.getEmail())||UtilString.isEmpty(ouser.getPassword())){
            //将状态码、提示信息、回显数据设置到消息模型对象中，返回消息模型对象
            messageModel.setCode(0);
            messageModel.setMsg("邮箱和密码不能为空！");
            //回显数据
            return messageModel;
        }
        //2.调用dao层查询方法，通过邮箱查询用户对象
        //entireOuser指的是字段齐全的对象
        OrdinaryUser entireOuser = userDao.queryUserByEmail(ouser.getEmail());
        System.out.println(entireOuser);
        //3.判断用户对象是否为空
        if (entireOuser==null){
            //将状态码、提示信息、回显数据设置到消息模型对象中，返回消息模型对象
            messageModel.setCode(0);
            messageModel.setMsg("用户不存在！");
            return messageModel;
        }

        //4.比较查询对象的密码和前台传过来的密码是否相同
        if (!ouser.getPassword().equals(entireOuser.getPassword())){
            //如果不相等，将状态码、提示信息、回显数据设置到消息模型对象中，返回消息模型对象
            messageModel.setCode(0);
            messageModel.setMsg("用户密码不正确！");
            return messageModel;
        }

        //5.登录成功，将用户信息设置到消息模型中：重新设置
        messageModel.setObject(entireOuser);
        return messageModel;
    }

    /**
     * 管理员登录
     * @param admin
     * @return
     */
    public MessageModel userLogin(Administrator admin){
        MessageModel messageModel = new MessageModel();
        //先把原来的对象放到消息模型对象中
        messageModel.setObject(admin);

        //1.参数非空判断：email password
        if (UtilString.isEmpty(admin.getEmail())||UtilString.isEmpty(admin.getPassword())){
            //将状态码、提示信息、回显数据设置到消息模型对象中，返回消息模型对象
            messageModel.setCode(0);
            messageModel.setMsg("邮箱和密码不能为空！");
            //回显数据
            return messageModel;
        }
        //2.调用dao层查询方法，通过邮箱查询用户对象
        //entireOuser指的是字段齐全的对象
        Administrator entireOuser = userDao.queryUserByEmailAdmin(admin.getEmail());
        System.out.println(entireOuser);
        //3.判断用户对象是否为空
        if (entireOuser==null){
            //将状态码、提示信息、回显数据设置到消息模型对象中，返回消息模型对象
            messageModel.setCode(0);
            messageModel.setMsg("用户不存在！");
            return messageModel;
        }

        //4.比较查询对象的密码和前台传过来的密码是否相同
        if (!admin.getPassword().equals(entireOuser.getPassword())){
            //如果不相等，将状态码、提示信息、回显数据设置到消息模型对象中，返回消息模型对象
            messageModel.setCode(0);
            messageModel.setMsg("用户密码不正确！");
            return messageModel;
        }

        //5.登录成功，将用户信息设置到消息模型中：重新设置
        messageModel.setObject(entireOuser);
        return messageModel;
    }

    /**
     * 用户注册
     * @param ouser
     * @return
     * @throws IOException
     */
    public MessageModel userRegister(OrdinaryUser ouser) throws IOException {
        MessageModel messageModel = new MessageModel();
        //先把原来的对象放到消息模型对象中
        messageModel.setObject(ouser);
        //1.参数非空判断：email password username
        if (UtilString.isEmpty(ouser.getEmail())||UtilString.isEmpty(ouser.getPassword())||
                UtilString.isEmpty(ouser.getUsername())){
            //将状态码、提示信息、回显数据设置到消息模型对象中，返回消息模型对象
            messageModel.setCode(0);
            messageModel.setMsg("邮箱、密码或姓名不能为空！");
            //回显数据
            return messageModel;
        }
        //2.邮箱、密码、合法性判断：暂时不予理会，因为是原型系统

        //3.将用户信息插入到数据库中
        IUserDao dao = UtilSqlSession.getSqlSession().getMapper(IUserDao.class);
        dao.insertOUser(ouser);
        UtilSqlSession.getSqlSession().commit();
        /*打印尝试*/
        List<OrdinaryUser> users = dao.findAll();
        for (OrdinaryUser user : users) {
            System.out.println(user);
        }
        //4.将用户对象填装到messageModel中
        messageModel.setObject(ouser);
        return messageModel;
    }

    /**
     * 获取一个用户参与过的所有的队伍
     * @return
     */
    public List<Group> findAllGroups(HttpServletRequest request) throws IOException {
        List<Group> groups=new LinkedList<>();
        /*
        1.获取用户的id
        2.查找用户参与过的所有队伍的Id
        3.创建groupService
        4.遍历id，调用groupService的查找方法，查找到Group对象
            将对象放到groups中
         */
        //1.获取用户的id
        OrdinaryUser user = (OrdinaryUser)request.getSession().getAttribute("user");
        Integer userId = user.getUserId();
        //2.查找用户参与过的所有队伍的Id
        List<Integer> groupIds = userAndGroupDao.findAllGroupIds(userId);
        //3.创建groupService
        GroupService groupService = new GroupService();
        //4.遍历id，调用groupService的查找方法，查找到Group对象
        for (Integer groupId : groupIds) {
            Group group = groupService.findByGroupId(groupId);
            groups.add(group);
        }
        return groups;
    }

    /**
     * 根据当前用户的Id找到所有的收藏
     * @param userId
     * @return
     */
    public List<Collection> findAllCollectionsByUserId(Integer userId) throws IOException {
        List<Collection> collections = new UserAndCollectionService().findAllCollectionsByUserId(userId);
        //返回对象
        return collections;
    }

    /**
     * 根据当前用户的Id获取用户的名字
     * @param userId
     * @return 用户姓名
     */
    public String findUserNameByUserId(Integer userId){
        String userName = userDao.findUserNameByUserId(userId);
        return userName;
    }

    public void saveNewInfo(OrdinaryUser user) throws IOException {
        //直接更新
        OrdinaryUser ouser = UtilUser.getUser();
        ouser.setUsername(user.getUsername());
        ouser.setSex(user.getSex());
        ouser.setAge(user.getAge());
        //更新当前用户的同时，对数据库做出修改
        userDao.updateInfoByUser(ouser);
        UtilSqlSession.getSqlSession().commit();
        //---
        //不用将当前的用户放到作用域中，因为是同一个用户
    }

    /**
     * 修改密码
     * @param password
     */
    public void updatePassword(String password,Integer userId) throws IOException {
        //直接调用这个方法
        userDao.updatePassword(password,userId);
        //提交
        UtilSqlSession.getSqlSession().commit();
        //将当前用户的密码修改
        UtilUser.getUser().setPassword(password);
    }

    public List<Group> adminSearch(String searchGroup,HttpServletRequest request) throws IOException {
        //1.获取提交内容
        String sgroup = searchGroup;
        System.out.println("sgroup:"+sgroup);
        List<Group> groups=null;
        //2.得到dao层代理对象
        IIndexDao indexDao = UtilSqlSession.getSqlSession().getMapper(IIndexDao.class);
        //3.判别是否为空
        if (!UtilString.isEmpty(sgroup)){
            /*根据输入的队伍名进行模糊查询*/
            //1.调用dao层的方法，传入sgroup，获取结果
            groups=indexDao.searchByGroup(sgroup);
        }
        //4.返回查询队伍列表
        return groups;
    }
}
